]> git.r.bdr.sh - rbdr/map/blobdiff - Map/Presentation/Base Components/MapTextEditor.swift
Add some debouncing
[rbdr/map] / Map / Presentation / Base Components / MapTextEditor.swift
index a7dbe52ee644b97ad0d3ad37cc3fff2b77d3447e..ff982034d1681f5247ef83d5ec5f02ef7b556710 100644 (file)
@@ -1,19 +1,17 @@
-/*
- Copyright (C) 2024 Rubén Beltrán del Río
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see https://map.tranquil.systems.
- */
+// Copyright (C) 2024 Rubén Beltrán del Río
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see https://map.tranquil.systems.
 import Cocoa
 import SwiftUI
 
@@ -66,7 +64,7 @@ class MapTextEditorController: NSViewController {
 
     scrollView.translatesAutoresizingMaskIntoConstraints = false
 
-    textView.backgroundColor = .ui.background
+    textView.backgroundColor = .UI.background
     textView.allowsUndo = true
     textView.delegate = self
     textView.textStorage?.delegate = self
@@ -91,10 +89,11 @@ class MapTextEditorController: NSViewController {
         textStorage.removeAttribute(
           .backgroundColor, range: NSRange(location: 0, length: textStorage.length))
 
-        for range in highlightRanges {
+        for (index, range) in highlightRanges.enumerated() {
           let nsRange = NSRange(range, in: textStorage.string)
 
-          textStorage.addAttribute(.backgroundColor, value: NSColor.syntax.match, range: nsRange)
+          let color = index == selectedRange ? NSColor.Syntax.highlightMatch : NSColor.Syntax.match
+          textStorage.addAttribute(.backgroundColor, value: color, range: nsRange)
         }
 
         textView.needsDisplay = true
@@ -110,19 +109,10 @@ class MapTextEditorController: NSViewController {
           let range = highlightRanges[selectedRange]
           let nsRange = NSRange(range, in: textStorage.string)
           textView.scrollRangeToVisible(nsRange)
-          textView.selectedRange = nsRange
         }
       }
     }
   }
-
-  private func setSelectionColor() {
-    guard let textView = self.textView else { return }
-
-    var selectedTextAttributes = textView.selectedTextAttributes
-    selectedTextAttributes[.backgroundColor] = NSColor.yellow.withAlphaComponent(0.3)
-    textView.selectedTextAttributes = selectedTextAttributes
-  }
 }
 
 extension MapTextEditorController: NSTextViewDelegate {
@@ -166,77 +156,77 @@ extension MapTextEditorController: NSTextStorageDelegate {
 
     for match in matches {
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.vertex], range: match.range(at: 1))
+        [.foregroundColor: NSColor.Syntax.vertex], range: match.range(at: 1))
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.number], range: match.range(at: 2))
+        [.foregroundColor: NSColor.Syntax.number], range: match.range(at: 2))
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.number], range: match.range(at: 3))
+        [.foregroundColor: NSColor.Syntax.number], range: match.range(at: 3))
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.option], range: match.range(at: 4))
+        [.foregroundColor: NSColor.Syntax.option], range: match.range(at: 4))
     }
 
     matches = edgeRegex.matches(in: textStorage.string, options: [], range: range)
 
     for match in matches {
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.vertex], range: match.range(at: 1))
+        [.foregroundColor: NSColor.Syntax.vertex], range: match.range(at: 1))
       let arrowRange = match.range(at: 2)
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.symbol],
+        [.foregroundColor: NSColor.Syntax.symbol],
         range: NSMakeRange(arrowRange.lowerBound - 1, arrowRange.length + 1))
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.vertex], range: match.range(at: 3))
+        [.foregroundColor: NSColor.Syntax.vertex], range: match.range(at: 3))
     }
 
     matches = opportunityRegex.matches(in: textStorage.string, options: [], range: range)
 
     for match in matches {
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.option], range: match.range(at: 1))
+        [.foregroundColor: NSColor.Syntax.option], range: match.range(at: 1))
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.vertex], range: match.range(at: 2))
+        [.foregroundColor: NSColor.Syntax.vertex], range: match.range(at: 2))
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.symbol], range: match.range(at: 3))
+        [.foregroundColor: NSColor.Syntax.symbol], range: match.range(at: 3))
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.number], range: match.range(at: 4))
+        [.foregroundColor: NSColor.Syntax.number], range: match.range(at: 4))
     }
 
     matches = blockerRegex.matches(in: textStorage.string, options: [], range: range)
 
     for match in matches {
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.option], range: match.range(at: 1))
+        [.foregroundColor: NSColor.Syntax.option], range: match.range(at: 1))
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.vertex], range: match.range(at: 2))
+        [.foregroundColor: NSColor.Syntax.vertex], range: match.range(at: 2))
     }
 
     matches = noteRegex.matches(in: textStorage.string, options: [], range: range)
 
     for match in matches {
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.option], range: match.range(at: 1))
+        [.foregroundColor: NSColor.Syntax.option], range: match.range(at: 1))
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.number], range: match.range(at: 2))
+        [.foregroundColor: NSColor.Syntax.number], range: match.range(at: 2))
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.number], range: match.range(at: 3))
+        [.foregroundColor: NSColor.Syntax.number], range: match.range(at: 3))
     }
 
     matches = stageRegex.matches(in: textStorage.string, options: [], range: range)
 
     for match in matches {
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.option], range: match.range(at: 1))
+        [.foregroundColor: NSColor.Syntax.option], range: match.range(at: 1))
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.number], range: match.range(at: 2))
+        [.foregroundColor: NSColor.Syntax.number], range: match.range(at: 2))
     }
 
     matches = groupRegex.matches(in: textStorage.string, options: [], range: range)
 
     for match in matches {
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.option], range: match.range(at: 1))
+        [.foregroundColor: NSColor.Syntax.option], range: match.range(at: 1))
       textStorage.addAttributes(
-        [.foregroundColor: NSColor.syntax.vertex], range: match.range(at: 2))
+        [.foregroundColor: NSColor.Syntax.vertex], range: match.range(at: 2))
     }
   }
 }
@@ -261,6 +251,8 @@ struct MapTextEditor: NSViewControllerRepresentable {
     context: NSViewControllerRepresentableContext<MapTextEditor>
   ) {
     nsViewController.highlightRanges = highlightRanges
-    nsViewController.selectedRange = selectedRange
+    if nsViewController.selectedRange != selectedRange {
+      nsViewController.selectedRange = selectedRange
+    }
   }
 }